package lp2.projeto.agenda;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import lp2.projeto.gerenciador.Contato;
import lp2.projeto.gerenciador.FormaDeContato;
import lp2.projeto.horario.Mes;


public class CadastroContatoJDialog extends JDialog{
	
	private static final long serialVersionUID = -702978768639702244L;
	
	// Referencias a caixa de dialogo de cadastro de contatos
	protected JDialog cadastroContatoJDialog;
	protected JTextField nomeCJTextField;
	protected JTextField enderecoCJTextField;
	protected JButton fecharJButton;
	protected JButton removerFormaDeContatoJButton;
	protected JButton cadastrarContatoJButton;
	protected JList formasDeContatoJList;
	protected DefaultListModel formasDeContatoListModel;
	protected JScrollPane formasDeContatoJScrollPane;
	protected JComboBox diaCombo;
	protected JComboBox mesCombo;
	protected JComboBox anoCombo;
	protected Contato contato;
	protected JButton formasDeContatoJButton;
	
	private void cadastraContato() {
		JDialog cadastroFormaDeContato = new CadastroFormaDeContatoJDialog(this);
		cadastroFormaDeContato.setResizable(true);
		cadastroFormaDeContato.setVisible(true);
	}
	
	public CadastroContatoJDialog(Contato contatoModificar){
		super();
		cadastroContatoJDialog = this;
		cadastroContatoJDialog.setModal(true);
		this.contato = contatoModificar;
		GridBagConstraints constraints = new GridBagConstraints();
		cadastroContatoJDialog.setSize(430, 280);
		JPanel cadastroContatoJPanel = (JPanel) cadastroContatoJDialog.getContentPane();
		cadastroContatoJPanel.setLayout(new GridBagLayout());	
		
		// Criacao do JList das Formas De Contato
		formasDeContatoListModel = new DefaultListModel();
		formasDeContatoJList = new JList(formasDeContatoListModel);
		formasDeContatoJList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
		formasDeContatoJScrollPane = new JScrollPane(formasDeContatoJList);
		formasDeContatoJScrollPane.setPreferredSize(new Dimension(100, 40));
		
		
		// Criacao dos JTextFields
		nomeCJTextField = new JTextField(15);
		enderecoCJTextField = new JTextField(15);
		
		// Criacao dos JLabels
		JLabel nomeJLabel = new JLabel("Nome:");
		JLabel enderecoJLabel = new JLabel("Endereco:");
		JLabel dataJLabel = new JLabel("Data:");
		JLabel formasDeContatoJLabel = new JLabel("Formas de Contato:");
		
		// Criacao do JComboBox dos Anos
		Integer[] listaAnos = new Integer[111];
		for (int i = 2011; i > 1900; i--)	listaAnos[2011-i] = i;	
		anoCombo = new JComboBox(listaAnos);
		
		// Criacao do JComboBox dos Dias
		Integer[] listaDias = new Integer[31];
		for (int i = 1; i <= 31; i++)	listaDias[i-1] = i;	
		diaCombo = new JComboBox(listaDias);
		
		// Criacao do JComboBox dos Meses
		mesCombo = new JComboBox(Mes.values());
		
		// Criacao do JPanel que encapsulara os ComboBox's
		JPanel dataJPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
		
		// Adicao de Listener para o ComboBox de Meses
		mesCombo.addActionListener(new ActionListener() {
			
			// Listener responsavel pela admnistracao do formato da data
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Integer numDiasDoMes = Mes.getNumDiasNoMes( (Mes) mesCombo.getSelectedItem(), 
						(Integer) anoCombo.getSelectedItem());
				Integer diaAtual = (Integer)diaCombo.getSelectedItem();
				
				
				if (numDiasDoMes < 	diaAtual){
					diaCombo.removeAllItems();
					for (int i = 1; i <= numDiasDoMes; i++)	diaCombo.addItem(i);	
					diaCombo.setSelectedItem(numDiasDoMes);
				} else {
					for (int i = diaAtual; i < numDiasDoMes;) diaCombo.addItem(++i);
				}
				
			}
		});
			
		// Adicao de Listener para o ComboBox de Anos
		anoCombo.addActionListener(new ActionListener() {
			
			// Listener responsavel pela admnistracao do formato da data
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Integer numDiasDoMes = Mes.getNumDiasNoMes( (Mes) mesCombo.getSelectedItem(), 
						(Integer) anoCombo.getSelectedItem());
				Integer diaAtual = (Integer)diaCombo.getSelectedItem();
				
				
				if (numDiasDoMes < 	diaAtual){
					diaCombo.removeAllItems();
					for (int i = 1; i <= numDiasDoMes; i++)	diaCombo.addItem(i);	
					diaCombo.setSelectedItem(numDiasDoMes);
				} else {
					for (int i = diaAtual; i < numDiasDoMes;) diaCombo.addItem(++i);
				}
				
			}
		});
		
		
		// Adicao dos JComboBox no Panel da Data
		dataJPanel.add(diaCombo);
		dataJPanel.add(mesCombo);
		dataJPanel.add(anoCombo);
		 
		// Criacao do botao de fechar
		JButton fecharJButton = new JButton("Fechar");
		fecharJButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				cadastroContatoJDialog.dispose();
				
			}
		});
		
		// Criacao do JButton de Cadastro de Formas de Contato
		formasDeContatoJButton = new JButton("Cadastrar Forma de Contato");
		formasDeContatoJButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				cadastraContato();
			}
		});
		
		// Criacao do JButton de Cadastro do Contato
		cadastrarContatoJButton = new JButton("Cadastrar Contato");
		cadastrarContatoJButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (contato == null){
					 int tamanhoLista = formasDeContatoListModel.getSize();  
			         ArrayList<FormaDeContato> listaFormasDeContato = new ArrayList<FormaDeContato>();  
			         for (int i=0; i < tamanhoLista; i++){  
			        	 listaFormasDeContato.add((FormaDeContato) formasDeContatoListModel.getElementAt(i));  
			          }  
			         Contato contato_novo = new Contato(nomeCJTextField.getText(),
								enderecoCJTextField.getText(),
								diaCombo.getSelectedItem() + "/" + mesCombo.getSelectedItem() + "/" + anoCombo.getSelectedItem(),
								listaFormasDeContato);
			         AgendaGrafica.gerente.adicionaContato(contato_novo);
			  
			         AgendaGrafica.atualizarListas();	
				} else {
					contato.setNome(nomeCJTextField.getText());
					contato.setEndereco(enderecoCJTextField.getText());
					contato.setDataAniversario("" + diaCombo.getSelectedItem() +
							"/" +  (mesCombo.getSelectedIndex() + 1) +
							"/" + diaCombo.getSelectedItem() );
					
					for(FormaDeContato formaDeContato :  (FormaDeContato[]) contato.getFormasDeContato().toArray(new FormaDeContato[contato.getFormasDeContato().size()])){
						contato.removeFormaDeContato(formaDeContato);
					}
					
					int tamanhoLista = formasDeContatoListModel.getSize();  
			        ArrayList<FormaDeContato> listaFormasDeContato = new ArrayList<FormaDeContato>();  
			        for (int i=0; i < tamanhoLista; i++){  
			        	listaFormasDeContato.add((FormaDeContato) formasDeContatoListModel.getElementAt(i));  
			        }  
					for(FormaDeContato formaDeContato : listaFormasDeContato){
						contato.addFormaDeContato(formaDeContato);
					}
					
					AgendaGrafica.atualizarListas();
				}
			
		         
				 cadastroContatoJDialog.dispose();
				
			}
		});
		
		// Criacao do JButton de Remo��o de Formas de Contato
		
		removerFormaDeContatoJButton = new JButton("Remover Forma de Contato");
		removerFormaDeContatoJButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				if( formasDeContatoJList.getSelectedIndex() == -1) {
					avisoJDialog avisoJDialog = new avisoJDialog("Por Favor Selecione uma Forma de Contato");
					avisoJDialog.setVisible(true);
				} else {
					formasDeContatoListModel.remove(formasDeContatoJList.getSelectedIndex());
				}
			}
		});
				
		
		//Adicao dos Componentes no JPane Principal
		
		constraints.anchor = GridBagConstraints.CENTER;
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.weightx = 0;
		constraints.weighty = 0.1;
		constraints.insets = new Insets(5,5,5,5); 
		constraints.gridx = 0;   
		constraints.gridy = 0; 
		constraints.gridwidth = 1; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(nomeJLabel,constraints);
		
		constraints.weightx = 0.7;
		constraints.gridx = 1;   
		constraints.gridy = 0; 
		constraints.gridwidth = 2; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(nomeCJTextField,constraints);
		
		constraints.weightx = 0; 
		constraints.gridx = 0;   
		constraints.gridy = 1; 
		constraints.gridwidth = 1; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(enderecoJLabel,constraints);
		
		constraints.weightx = 0.7;
		constraints.gridx = 1;   
		constraints.gridy = 1; 
		constraints.gridwidth = 2; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(enderecoCJTextField,constraints);	
		
		constraints.weightx = 0; 
		constraints.gridx = 0;   
		constraints.gridy = 2; 
		constraints.gridwidth = 1; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(dataJLabel,constraints);
		
		constraints.weightx = 0.7; 
		constraints.gridx = 1;   
		constraints.gridy = 2; 
		constraints.gridwidth = 2; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(dataJPanel,constraints);
		
		constraints.weightx = 0; 
		constraints.gridx = 0;   
		constraints.gridy = 3; 
		constraints.gridwidth = 1; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(formasDeContatoJLabel,constraints);
		
		constraints.weightx = 0; 
		constraints.gridx = 1 ;  
		constraints.gridy = 3; 
		constraints.gridwidth = 2; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(formasDeContatoJScrollPane,constraints);		
		
		constraints.weightx = 0.7; 
		constraints.gridx = 1 ;  
		constraints.gridy = 4; 
		constraints.gridwidth = 2; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(formasDeContatoJButton,constraints);
		
		constraints.weightx = 0; 
		constraints.gridx = 0 ;  
		constraints.gridy = 4; 
		constraints.gridwidth = 1; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(removerFormaDeContatoJButton,constraints);

		
		constraints.weightx = 0; 
		constraints.gridx = 0;   
		constraints.gridy = 5; 
		constraints.gridwidth = 1; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(fecharJButton,constraints);
		
		constraints.weightx = 0; 
		constraints.gridx = 2;   
		constraints.gridy = 5; 
		constraints.gridwidth = 1; 
		constraints.gridheight = 1;
		cadastroContatoJPanel.add(cadastrarContatoJButton,constraints);
		
	}
	public void atualizaDados(){
	nomeCJTextField.setText(contato.getNome());
	enderecoCJTextField.setText(contato.getEndereco());
	formasDeContatoListModel.removeAllElements();
	for (FormaDeContato formaDeContato : contato.getFormasDeContato()){
		formasDeContatoListModel.addElement(formaDeContato);
	}
	String[] listaMeses = {"JANEIRO","FEVEIREIRO", "MARCO", "ABRIL", "MAIO", "JUNHO",
			"JULHO","AGOSTO","SETEMBRO","OUTUBRO","NOVEMBRO","DEZEMBRO"};

	int dia = Integer.parseInt(contato.getDataAniversario().split("/")[0]);
	
	int mesIndex = 0;
	for (int i = 0; i  < listaMeses.length; i++) {
		if (listaMeses[i].equals(contato.getDataAniversario())){
			mesIndex = i;
		}
	}
	int ano = Integer.parseInt(contato.getDataAniversario().split("/")[2]);
	
	
	diaCombo.setSelectedItem(dia);
	mesCombo.setSelectedItem(Mes.values()[mesIndex]);
	anoCombo.setSelectedItem(ano);
	}

	public void trancaDados() {
		nomeCJTextField.setEditable(false);
		enderecoCJTextField.setEditable(false);
		diaCombo.setEnabled(false);
		mesCombo.setEnabled(false);
		anoCombo.setEnabled(false);
		cadastrarContatoJButton.setEnabled(false);
		removerFormaDeContatoJButton.setEnabled(false);
		formasDeContatoJButton.setEnabled(false);
		
	}
	
}
